#ifndef ULTRASONIC_H
#define ULTRASONIC_H

#pragma pack(1) // 关闭字节对齐

#define ULTRASONIC_CRTSCTS (1 << 16) // 控制模式
#define ULTRASONIC_ACK_MAX (32)      // 数据最大值

#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <map>
#include <math.h>
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <vector>

using namespace std;

extern unsigned int sleep(unsigned int);

class Ultrasonic {
  public:
    /***
     * @name 超声波参数
     * @description
     * @struct
     */
    typedef struct tagULTRASONICPARAM {
        int32_t *fd;            // 超声波指针
        pthread_t *tid;         // 超声波ID
        uint32_t *signal;       // 超声波信号
        uint32_t *distance;     // 超声波距离
        vector< uint8_t > *ack; // 超声波数据
    } ULTRASONICPARAM, *HULTRASONICPARAM;

    // 析构、构造
    ~Ultrasonic();
    Ultrasonic(const string path, const uint32_t baudrate);

    // 获取距离、获取数据
    uint32_t &get_distance();
    vector< uint8_t > &get_ack();

  private:
    int32_t fd;            // 超声波指针
    pthread_t tid;         // 超声波线程
    uint32_t signal;       // 超声波信号
    uint32_t distance;     // 距离
    vector< uint8_t > ack; // 数据
    ULTRASONICPARAM param; // 参数
};
#endif